/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable no-unused-vars */
/* eslint-disable @typescript-eslint/no-unused-vars */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
/* eslint-disable @typescript-eslint/explicit-function-return-type */
import { PropType } from 'vue';
import {
  IGlobalConfig,
  IToolbarModel,
  IScheduleResource,
} from '../../interface';
import Variables from '../../constant/vars';

// 调度表格属性
export const ScheduleTableProps = {
  /**
   * 资源列表属性
   * @description 定义调度器中的资源列表，用于展示可分配任务的实体（如人员、设备等）
   * @type {IScheduleResource[]} 资源对象数组
   * @default [] 默认为空数组
   */
  resources: {
    type: Array as PropType<IScheduleResource[]>,
    default: () => [],
  },

  /**
   * 任务列表属性
   * @description 定义调度器中的任务列表，包含需要被安排到资源上的各项任务
   * @type {IScheduleTask[]} 任务对象数组
   * @default [] 默认为空数组
   */
  tasks: {
    type: Array as PropType<IScheduleTask[]>,
    default: () => [],
  },

  /**
   * 调度起始时间属性
   * @description 设置调度视图的时间范围开始点
   * @type {Date} 起始日期时间对象
   * @default Variables.default.startTime 默认值来自全局变量配置
   */
  startTime: {
    type: Object as PropType<Date>,
    default: Variables.default.startTime,
  },

  /**
   * 调度结束时间属性
   * @description 设置调度视图的时间范围结束点
   * @type {Date} 结束日期时间对象
   * @default Variables.default.endTime 默认值来自全局变量配置
   */
  endTime: {
    type: Object as PropType<Date>,
    default: Variables.default.endTime,
  },

  /**
   * 头部行高度属性
   * @description 控制调度器头部区域每行的高度
   * @type {Number} 高度数值（单位通常为像素）
   * @default Variables.default.headerRowHeight 默认值来自全局变量配置
   */
  headerRowHeight: {
    type: Number,
    default: Variables.default.headerRowHeight,
  },

  /**
   * 头部背景颜色属性
   * @description 设置调度器头部区域的背景色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.headerBgColor 默认值来自全局变量配置
   */
  headerBgColor: {
    type: String,
    default: Variables.default.headerBgColor,
  },

  /**
   * 头部文字颜色属性
   * @description 设置调度器头部区域的文字颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.headerTextColor 默认值来自全局变量配置
   */
  headerTextColor: {
    type: String,
    default: Variables.default.headerTextColor,
  },

  /**
   * 资源列宽度属性
   * @description 控制资源列表所在列的显示宽度
   * @type {Number} 宽度数值（单位通常为像素）
   * @default Variables.default.resourceColumnWidth 默认值来自全局变量配置
   */
  resourceColumnWidth: {
    type: Number,
    default: Variables.default.resourceColumnWidth,
  },

  /**
   * 资源主体行高属性
   * @description 设置资源主体部分每一行的高度
   * @type {Number} 行高度数值（单位通常为像素）
   * @default Variables.default.resourceBodyRowHeight 默认值来自全局变量配置
   */
  resourceBodyRowHeight: {
    type: Number,
    default: Variables.default.resourceBodyRowHeight,
  },

  /**
   * 资源主体背景色属性
   * @description 设置资源主体区域的背景颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.resourceBodyBg 默认值来自全局变量配置
   */
  resourceBodyBg: {
    type: String,
    default: Variables.default.resourceBodyBg,
  },

  /**
   * 资源驱动线颜色属性
   * @description 设置连接资源与任务之间的驱动线颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.resourceDriverColor 默认值来自全局变量配置
   */
  resourceDriverColor: {
    type: String,
    default: Variables.default.resourceDriverColor,
  },

  /**
   * 时间刻度列宽属性
   * @description 控制时间刻度列的显示宽度
   * @type {Number} 列宽度数值（单位通常为像素）
   * @default Variables.default.scaleColumnWidth 默认值来自全局变量配置
   */
  scaleColumnWidth: {
    type: Number,
    default: Variables.default.scaleColumnWidth,
  },

  /**
   * 时间刻度范围属性
   * @description 定义时间轴上可见的时间段范围
   * @type {number[]} 数字数组表示时间段范围
   * @default Variables.default.scaleRange 默认值来自全局变量配置
   */
  scaleRange: {
    type: Array as PropType<number[]>,
    default: Variables.default.scaleRange,
  },

  /**
   * 时间刻度值属性
   * @description 设置时间刻度的基本单位值
   * @type {Number} 时间间隔数值
   * @default Variables.default.scaleValue 默认值来自全局变量配置
   */
  scaleValue: {
    type: Number,
    default: Variables.default.scaleValue,
  },

  /**
   * 时间刻度背景色属性
   * @description 设置时间刻度区域的背景颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.scaleBodyBg 默认值来自全局变量配置
   */
  scaleBodyBg: {
    type: String,
    default: Variables.default.scaleBodyBg,
  },

  /**
   * 时间刻度文字颜色属性
   * @description 设置时间刻度区域的文字颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.scaleTextColor 默认值来自全局变量配置
   */
  scaleTextColor: {
    type: String,
    default: Variables.default.scaleTextColor,
  },

  /**
   * 网格线颜色属性
   * @description 设置调度器网格线的颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.gridLineColor 默认值来自全局变量配置
   */
  gridLineColor: {
    type: String,
    default: Variables.default.gridLineColor,
  },

  /**
   * 是否允许拖拽属性
   * @description 控制是否启用任务元素的拖拽功能
   * @type {Boolean} 布尔值开关
   * @default Variables.default.allowDrag 默认值来自全局变量配置
   */
  allowDrag: {
    type: Boolean,
    default: Variables.default.allowDrag,
  },

  /**
   * 拖拽步进间隔属性
   * @description 设置拖拽操作时移动的最小时间间隔
   * @type {Number} 步进时间数值（单位通常为分钟或小时）
   * @default Variables.default.dragInterval 默认值来自全局变量配置
   */
  dragInterval: {
    type: Number,
    default: Variables.default.dragInterval,
  },

  /**
   * 拖拽放置资源前处理函数属性
   * @description 在任务元素准备放置时执行，用于处理放置前的逻辑
   * @type {Function} 处理函数
   * @default () => { ok: boolean; data: IData } ok返回true，表示允许放置操作
   */
  beforeResourceDrop: {
    type: Function as PropType<
      (dragData: Record<string, any>) => Promise<{ ok: boolean; data: IData }>
    >,
    default: (data: Record<string, any>) => ({ ok: true, data }),
  },

  /**
   * 拖拽放置任务前处理函数属性
   * @description 在任务元素准备放置时执行，用于处理放置前的逻辑
   * @type {Function} 处理函数
   * @default () => { ok: boolean; data: IData } ok返回true，表示允许放置操作
   */
  beforeTaskDrop: {
    type: Function as PropType<
      (
        dragData: Record<string, any>,
        startTime: Date,
        resource: IScheduleResource,
      ) => Promise<{ ok: boolean; data: IData }>
    >,
    default: (
      data: Record<string, any>,
      startTime: Date,
      resource: IScheduleResource,
    ) => ({ ok: true, data }),
  },

  /**
   * 任务更新前处理函数属性
   * @description 在任务元素准备更新时执行，用于处理更新前的逻辑
   * @type {Function} 处理函数
   * @default () => { ok: boolean; data: IData } ok返回true，表示允许更新操作
   */
  beforeTaskUpdate: {
    type: Function as PropType<
      (
        newTask: IScheduleTask,
        oldTask: IScheduleTask,
        newResource: IScheduleResource,
        oldResource: IScheduleResource,
      ) => Promise<{ ok: boolean; data: IData }>
    >,
    default: (
      newTask: IScheduleTask,
      oldTask: IScheduleTask,
      newResource: IScheduleResource,
      oldResource: IScheduleResource,
    ) => ({
      ok: true,
      data: newTask,
    }),
  },

  /**
   * 资源放置完成时处理函数属性
   * @description 在任务元素完成放置时执行，用于处理放置完成后的逻辑
   * @type {Function} 处理函数
   * @default () => true 默认返回true，表示后续逻辑的执行完成状态
   */
  resourceDropCompleted: {
    type: Function as PropType<
      (resource: IScheduleResource) => Promise<boolean>
    >,
    default: () => true,
  },

  /**
   * 任务放置完成时处理函数属性
   * @description 在任务元素完成放置时执行，用于处理放置完成后的逻辑
   * @type {Function} 处理函数
   * @default () => true 默认返回true，表示后续逻辑的执行完成状态
   */
  taskDropCompleted: {
    type: Function as PropType<(task: IScheduleTask) => Promise<boolean>>,
    default: () => true,
  },

  /**
   * 任务更新完成时处理函数属性
   * @description 在任务元素完成更新时执行，用于处理更新完成后的逻辑
   * @type {Function} 处理函数
   * @default () => true 默认返回true，表示后续逻辑的执行完成状态
   */
  taskUpdateCompleted: {
    type: Function as PropType<(task: IScheduleTask) => Promise<boolean>>,
    default: () => true,
  },

  /**
   * 标题属性
   * @description 用于显示标题
   * @type {String}  标题文本
   * @default Variables.default.caption 默认值来自全局变量配置
   */
  caption: {
    type: String,
    default: Variables.default.caption,
  },

  /**
   * 任务字体色属性
   * @description 用于设置任务元素的字体颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.taskBgColor 默认值来自全局变量配置
   */
  taskColor: {
    type: String,
    default: Variables.default.taskColor,
  },

  /**
   * 任务背景色属性
   * @description 用于设置任务元素的背景颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.taskBgColor 默认值来自全局变量配置
   */
  taskBgColor: {
    type: String,
    default: Variables.default.taskBgColor,
  },

  /**
   * 任务激活边框颜色
   * @description 用于设置任务元素选中状态的边框颜色
   * @type {String} CSS颜色值字符串
   * @default Variables.default.taskBgColor 默认值来自全局变量配置
   */
  taskAcitveBorderColor: {
    type: String,
    default: Variables.default.taskAcitveBorderColor,
  },

  /**
   * 任务插槽限制
   * @description 用于设置任务插槽的限制条件
   * @type {{ minWidth: number, minHeight: number }} 最小宽，最小高
   * @default Variables.default.taskSlotLimit 默认值来自全局变量配置
   */
  taskSlotLimit: {
    type: Object as PropType<{ minWidth: number; minHeight: number }>,
    default: Variables.default.taskSlotLimit,
  },

  /**
   * 任务颜色配置
   * @description 用于设置任务元素颜色
   * @type {{
   *     [p: string]: {
   *       taskColor: string;
   *       taskBgColor: string;
   *       taskAcitveBorderColor: string;
   *     };
   *   }} 任务颜色配置对象
   */
  taskColorOptions: {
    type: Object as PropType<
      | {
          [p: string]: {
            taskColor: string;
            taskBgColor: string;
            taskAcitveBorderColor: string;
          };
        }
      | undefined
    >,
  },

  /**
   * 任务类型属性名称
   * @description 用于在任务颜色配置中获取颜色
   */
  taskTypeField: {
    type: String,
    default: '',
  },

  /**
   * 工具栏模型
   * @description 指定预置工具栏项的启用状态
   */
  toolarModel: {
    type: Object as PropType<IToolbarModel>,
  },
};

// 调度表格事件
export const ScheduleTableEvent = {
  /**
   * 保存当前调度配置、资源和任务数据
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param resources 调度资源数组，包含所有可用的资源信息
   * @param tasks 调度任务数组，包含所有需要执行的任务信息
   * @returns 始终返回true，表示保存操作已执行
   */
  save: (
    config: IGlobalConfig,
    resources: IScheduleResource[],
    tasks: IScheduleTask[],
  ) => true,

  /**
   * 另存为当前调度配置、资源和任务数据
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param resources 调度资源数组，包含所有可用的资源信息
   * @param tasks 调度任务数组，包含所有需要执行的任务信息
   * @returns 始终返回true，表示另存为操作已执行
   */
  saveAs: (
    config: IGlobalConfig,
    resources: IScheduleResource[],
    tasks: IScheduleTask[],
  ) => true,

  /**
   * 处理右键菜单事件
   * @param type 菜单类型，可以是'resource'、'task'或'cell'
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param data 触发菜单事件资源、任务或单元格数据对象
   * @param event 鼠标右键点击事件对象
   * @returns 始终返回true，表示菜单处理已完成
   */
  contextMenu: (
    type: 'resource' | 'task' | 'cell',
    config: IGlobalConfig,
    data: IScheduleResource | IScheduleTask | IData,
    event: MouseEvent,
  ) => true,

  /**
   * 处理内容点击事件
   * @param type 菜单类型，可以是'resource'、'task'或'cell'
   * @param config 全局配置对象，包含调度器的各种配置参数
   * @param data 触发菜单事件资源、任务或单元格数据对象
   * @param event 鼠标点击事件对象
   * @returns 始终返回true，表示任务点击处理已完成
   */
  bodyClick: (
    type: 'resource' | 'task' | 'cell',
    config: IGlobalConfig,
    data: IScheduleResource | IScheduleTask | IData,
    event: MouseEvent,
  ) => true,
};
